#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <string>
#include <algorithm>

using namespace std;

// Задание 1
void task1()
{
    string word1, word2;
    cout << "Задание 1: Введите два слова: ";
    cin >> word1 >> word2;

    char lastChar = word2.back();
    int count = count_if(word1.begin(), word1.end(), [lastChar](char c)
                         { return c == lastChar; });

    cout << "Буква '" << lastChar << "' встречается в первом слове " << count << " раз(а)." << endl;
}

// Задание 2
void task2()
{
    cin.ignore(); // Очищаем буфер ввода
    string inputText;
    cout << "Задание 2: Введите текст: ";
    getline(cin, inputText);

    size_t spacePos = inputText.find(' ');
    size_t commaPos = inputText.find(',');

    if (spacePos != string::npos && commaPos != string::npos && spacePos < commaPos)
    {
        string result = inputText.substr(spacePos + 1, commaPos - spacePos - 1);
        cout << "Информация между пробелом и запятой: " << result << endl;
    }
    else
    {
        cout << "В тексте нет пробела и/или запятой." << endl;
    }
}

// Задание 3
void task3()
{
    ifstream inputFile("input.txt");
    ofstream outputFile("output.txt");

    if (!inputFile)
    {
        cerr << "Задание 3: Ошибка открытия файла input.txt." << endl;
        return;
    }

    if (!outputFile)
    {
        cerr << "Задание 3: Ошибка открытия файла output.txt." << endl;
        return;
    }

    string line;
    int lineNumber = 1;

    while (getline(inputFile, line))
    {
        outputFile << lineNumber << ": " << line << endl;
        lineNumber++;
    }

    inputFile.close();
    outputFile.close();
    cout << "Задание 3: Содержимое файла скопировано с нумерацией строк в output.txt." << endl;
}

// Задание 4
void task4()
{
    vector<float> vector1 = {1.1, 2.2, 3.3};
    vector<float> vector2 = {4.4, 5.5, 6.6};
    vector<float> vector3(vector1.size());

    for (size_t i = 0; i < vector1.size(); i++)
    {
        vector3[i] = vector1[i] + vector2[i];
    }

    cout << "Задание 4: Результат суммирования векторов:" << endl;
    for (float val : vector3)
    {
        cout << val << " ";
    }
    cout << endl;
}

// Задание 5
void task5()
{
    list<int> myList = {1, -2, 3, -4, 5};
    int positiveCount = count_if(myList.begin(), myList.end(), [](int num)
                                 { return num > 0; });

    cout << "Задание 5: Количество положительных элементов в списке: " << positiveCount << endl;
}

// Задание 6
class Card
{
public:
    string title;
    string author;
    int number;

    Card() : title(""), author(""), number(0) {}
    Card(string t, string a, int n) : title(t), author(a), number(n) {}
};

void task6()
{
    vector<Card> library;
    library.push_back(Card("Book1", "Author1", 3));
    library.push_back(Card("Book2", "Author2", 2));
    library.push_back(Card("Book3", "Author1", 5));
    library.push_back(Card("Book4", "Author3", 1));
    library.push_back(Card("Book5", "Author4", 4));

    cout << "Задание 6: Библиотека:" << endl;
    for (const Card &card : library)
    {
        cout << "Название: " << card.title << ", Автор: " << card.author << ", Количество: " << card.number << endl;
    }

    string searchAuthor;
    cout << "Введите автора для поиска книг: ";
    cin >> searchAuthor;

    bool found = false;
    cout << "Найденные книги этого автора:" << endl;
    for (const Card &card : library)
    {
        if (card.author == searchAuthor)
        {
            cout << "Название: " << card.title << ", Количество: " << card.number << endl;
            found = true;
        }
    }

    if (!found)
    {
        cout << "Книг этого автора в библиотеке нет." << endl;
    }
}

// Задание 7
class Complex
{
public:
    double real;
    double imag;

    Complex(double r, double i) : real(r), imag(i) {}
};

void task7()
{
    list<Complex> complexList;
    complexList.push_back(Complex(-1.2, 6.3));
    complexList.push_back(Complex(4.0, 0.7));
    complexList.push_back(Complex(7.2, -0.8));
    complexList.push_back(Complex(5.3, 3.0));
    complexList.push_back(Complex(-4.9, 6.6));
    complexList.push_back(Complex(-9.3, 0.2));

    cout << "Задание 7: Комплексные числа:" << endl;
    for (const Complex &num : complexList)
    {
        cout << num.real << " + i * " << num.imag << endl;
    }

    double sumReal = 0.0;
    double sumImag = 0.0;

    for (const Complex &num : complexList)
    {
        sumReal += num.real;
        sumImag += num.imag;
    }

    cout << "Сумма всех комплексных чисел: " << sumReal << " + i * " << sumImag << endl;
}

// Задание 8
void task8()
{
    map<int, double> numberMap;

    for (int i = 1; i <= 9; i++)
    {
        numberMap[i] = i * 1.1;
    }

    cout << "Задание 8: Содержимое отображения:" << endl;
    for (const auto &pair : numberMap)
    {
        cout << pair.first << " - " << pair.second << endl;
    }

    for (auto it = numberMap.begin(); it != numberMap.end();)
    {
        if (it->first % 2 == 0)
        {
            it = numberMap.erase(it);
        }
        else
        {
            ++it;
        }
    }

    cout << "Отображение после удаления элементов с четными ключами:" << endl;
    for (const auto &pair : numberMap)
    {
        cout << pair.first << " - " << pair.second << endl;
    }
}

// Задание 9
void task9()
{
    map<string, string> phoneBook;
    phoneBook["1112233"] = "Ivanov";
    phoneBook["9871234"] = "Petrov";
    phoneBook["5671234"] = "Sidorov";

    string mas[4] = {"1112233", "9871234", "5671234", "5556688"};

    cout << "Задание 9: Фамилии по номерам телефонов из массива:" << endl;
    for (const string &number : mas)
    {
        if (phoneBook.find(number) != phoneBook.end())
        {
            cout << phoneBook[number] << endl;
        }
    }
}

int main()
{
    task1();
    cout << endl;
    task2();
    cout << endl;
    task3();
    cout << endl;
    task4();
    cout << endl;
    task5();
    cout << endl;
    task6();
    cout << endl;
    task7();
    cout << endl;
    task8();
    cout << endl;
    task9();

    return 0;
}
